package dk.muldbjergskolen.ctr;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;

import dk.muldbjergskolen.db.*;
import dk.muldbjergskolen.model.*;

public class LektionCtr 
{ 
	private LektionDB bDB = new LektionDB();
	private LokaleCtr lC = new LokaleCtr();
	private KlasseCtr kC = new KlasseCtr();
	private TidsIntervalCtr tC = new TidsIntervalCtr();
	
	
	public LektionCtr()
	{
		
	}
	
	/**
	 * Finder alle lokaler.
	 * @return
	 */
	public ArrayList<Lokale> findLokaler()
	{
		return lC.findLokaler();
	}
	
	/**
	 * Finder alle klasser.
	 * @return
	 */
	public ArrayList<Klasse> findKlasser()
	{
		return kC.findKlasser();
	}

	/**
	 * Opretter en række bookinger atomisk (alt eller intet).
	 * @param lektioner som skal oprettes.
	 * @throws LektionEksistererAlleredeException	hvis en eller flere bookinger allerede eksisterer.
	 * @throws Exception	ved en ukendt fejl.
	 */
	public void opretLektioner(ArrayList<Lektion> lektioner) throws LektionEksistererAlleredeException, Exception
	{
		try
		{
			ConnectionDB.startTransaction();
			
			for (Lektion b : lektioner)
			{
				bDB.opretLektion(b);
			}
			
			ConnectionDB.commitTransaction();
		}
		catch (Exception e)
		{
			System.out.println("LektionCtr.opretLektioner: " + e.getMessage());
			ConnectionDB.rollbackTransaction();
			
			// Ved en dublet.
			if (e.getMessage().contains("duplicate"))
			{
				throw new LektionEksistererAlleredeException();
			}
			else
			{
				throw e;
			}
		}
	}
	
	/**
	 * Sletter en eller flere lektioner atomisk.
	 * @param lektioner	som skal slettes.
	 * @throws SQLException
	 */
	public void sletLektioner(ArrayList<Lektion> lektioner) throws SQLException
	{
		try
		{
			ConnectionDB.startTransaction();
			
			for (Lektion lektion : lektioner)
			{
				bDB.sletLektion(lektion);
			}
			
			ConnectionDB.commitTransaction();
		}
		catch (SQLException e)
		{
			ConnectionDB.rollbackTransaction();
			
			throw e;
		}
	}

	//Finder et lokale.
	public Lokale findLokale(String navn)
	{		
		return lC.findLokale(navn);
	}
	
	//Finder en klasse.
	public Klasse findKlasse(String navn, int aargang)
	{
		return kC.findKlasse(navn, aargang);
	}
	
	/**
	 * Finder lektionerne med et bestemt lokale i et dato interval.
	 * @param fraDato
	 * @param tilDato
	 * @param lokale
	 * @return	en liste med besatte bookinger.
	 */
	public ArrayList<Lektion> findLektioner(Date fraDato, Date tilDato, Lokale lokale)
	{
		return bDB.findLektioner(fraDato, tilDato, lokale);
	}
	
	/**
	 * Finder lektionerne som et inventar er booket til - i et dato interval.
	 * @param fraDato
	 * @param tilDato
	 * @param inventar
	 * @return	en liste med besatte bookinger.
	 */
	public ArrayList<Lektion> findLektioner(Date fraDato, Date tilDato, Inventar inventar)
	{
		return bDB.findLektioner(fraDato, tilDato, inventar);
	}
	
	
	public ArrayList<TidsInterval> getTidsIntervaller()
	{
		return tC.getTidsInterval();
	}
	
	
	//
	// Exceptions
	//
	
	public static class LektionEksistererAlleredeException extends Exception
	{
	}
}
